Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

6주차 세미나 구현 과제 #5

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open

Conversation

jinkonu
Copy link
Contributor

@jinkonu jinkonu commented Jun 2, 2024

🧑‍🎤 요구사항

  • 가입 시 리프레쉬 토큰을 생성하여 사용자에게 반환한다.
  • 리프레쉬 토큰을 Redis 인메모리 해쉬로 관리한다.
  • 요청 헤더에 입력된 리프레쉬 토큰을 기반으로 액세스 토큰을 재발급한다.

 
 

👩🏼‍🌾 주요 코드

1. 토큰 DTO에 대한 타입 분류

public record AuthTokenSet(
String accessToken,
String refreshToken
) {
public static AuthTokenSet of(String accessToken, String refreshToken) {
return new AuthTokenSet(accessToken, refreshToken);
}
public enum Type {
ACCESS_TOKEN,
REFRESH_TOKEN
}
}

  • DTO 안에 enum을 두어 '액세스 토큰'과 '리프레쉬 토큰'을 구분했습니다.

 
 

public String issueToken(Long memberId, AuthTokenSet.Type type) {
Authentication authentication = UserAuthentication.createUserAuthentication(memberId);
if (type == AuthTokenSet.Type.ACCESS_TOKEN)
return generateToken(authentication, ACCESS_TOKEN_EXPIRATION_TIME);
String refreshToken = generateToken(authentication, REFRESH_TOKEN_EXPIRATION_TIME);
tokenService.save(memberId, refreshToken);
return refreshToken;
}

  • 덕분에 JwtTokenProvider에서 '토큰 발급'이라는 동일한 역할을 수행하는 메서드를 제거할 수 있었습니다.

 
 

2. 리프레쉬 토큰으로부터 액세스 토큰 재발급

public MemberTokenRefreshResponse refreshAccessToken(String refreshToken) {
if (jwtTokenProvider.validateToken(refreshToken) != VALID_JWT)
throw new UnauthorizedException(ErrorMessage.JWT_UNAUTHORIZED_EXCEPTION);
Long memberId = jwtTokenProvider.getMemberIdFromToken(refreshToken);
String accessToken = jwtTokenProvider.issueToken(memberId, ACCESS_TOKEN);
return MemberTokenRefreshResponse.of(accessToken);

  • redis에 저장된 값을 사용하지 않고, 리프레쉬 토큰을 파싱해서 사용자의 id를 조회했습니다.

 
 

🥷 API 테스트 결과

image

 
 

image

 
 

⁉️질문사항

  • 리프레쉬 토큰을 Redis라는 데이터베이스에 저장하게 된다면, 세션 기반의 사용자 인증과 동일하게 사용자 인증 정보를 서버가 유지해야 한다는 단점을 지게 되는 것이 아닌지 궁금하네요!

@jinkonu jinkonu self-assigned this Jun 3, 2024
@jinkonu jinkonu added enhancement New feature or request and removed enhancement New feature or request labels Jun 3, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant